/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package simhya;

import simhya.gui.*;
import java.awt.EventQueue;
import org.sbml.jsbml.*;



/**
 *
 * @author Luca
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        
        boolean test = false;
        if (test) 
            test();
        else {
            CommandPromptInteractor interactor;
            interactor = new CommandPromptInteractor();
            EventQueue.invokeLater(interactor);
        }
    }
    
    
    public static void test() {
        
        
        for (int i=0;i<100;i++) {
            System.out.println(simhya.matheval.function.RandomGenerator.nextGeometric(0.67));
        }
        
        
//        try {
//            simhya.matheval.Evaluator eval = new simhya.matheval.Evaluator();
//            simhya.matheval.Expression e1,e2,e3,e4;
//            eval.addConstant("kd", 2);
//            eval.addVariable("x", 1.0);
//            eval.addVariable("y", 2.0);
//            eval.addVariable("z", 3.0);
//            String v;
//            String s1 = "3*x*y - kd*z";
//          
//            
//            s1 = "cacca(x) = min(4*x,kd * y - exp(z))";
//            s1 = "cacca(x) = kd*x^2 - exp(z)";
//            System.out.println(s1 );
//            e1 = eval.parseExpression(s1);
//            s1 = "cacca(y + z^2)";
//            e1 = eval.parseExpression(s1);
//            System.out.println(e1.toString() );
//            v = "x";
//            e2 = e1.differentiate(v);
//            System.out.println("d(" + s1+ ")/d" + v +" = " + e2.toString() );
//            v = "y";
//            e2 = e1.differentiate(v);
//            System.out.println("d(" + s1+ ")/d" + v +" = " + e2.toString() );
//            v = "z";
//            e2 = e1.differentiate(v);
//            System.out.println("d(" + s1+ ")/d" + v +" = " + e2.toString() );
//            v = "kd";
//            e2 = e1.differentiate(v);
//            System.out.println("d(" + s1+ ")/d" + v +" = " + e2.toString() );
//            
//        } catch (Exception e) {
//           System.err.println(e);
//           e.printStackTrace();
//       } 
        
        
//       try { 
//         simhya.modelchecking.SMCenvironment smc;
//         simhya.model.flat.parser.FlatParser p = new simhya.model.flat.parser.FlatParser();
//         simhya.model.flat.FlatModel model = p.parseFromFile("SIR.txt");
//         
//         smc = new simhya.modelchecking.SMCenvironment(model);
//         smc.loadEnvironment("smc.txt");
//         smc.print_debug();
//         
//       } catch (Exception e) {
//           System.err.println(e);
//       } 
       
       
//       simhya.modelchecking.mtl.MTLformula f;
//       
//       simhya.modelchecking.mtl.parser.MTLparser p;
//       
//       //String s = "P=?[ (true) U<=T ( F >= k ( G[0,5]( X >= 10 ) ) ) ]";
//       String s = "P<0.4[(true)U<=T( F>=k G[0,5] {X >= 10} AND !sticazzi )]";
//       java.io.StringReader r = new java.io.StringReader(s);
//       simhya.modelchecking.mtl.parser.MTLlexer lex = new simhya.modelchecking.mtl.parser.MTLlexer(r);
//       
//      
//       try {
//           p = new simhya.modelchecking.mtl.parser.MTLparser(lex);
//           //p.debug_parse();
//           f = (simhya.modelchecking.mtl.MTLformula) p.parse().value;
//           
//           System.out.println(f.toFormulaTree());
//           
//       }
//       catch (Exception e) {
//           System.err.println(e);
//       }
//       
//        
        
//        simhya.matheval.Evaluator e = new simhya.matheval.Evaluator();
//        e.addVariable("X", 4.0);
//        e.addVariable("Y", 2.0);
//        e.addConstant("k", 1.5);
//        simhya.matheval.Expression exp = null,exp1,exp2,exp3;
//        
//        try {
//            exp = e.parseExpression("X == 1");            
//            e.addExpressionVariable("H", exp);
//            e.parseExpression("fun(A,B) = A >= B || k < 1");
//            exp1 = e.parseExpression("if(H,fun(X,Y),X>0) && Y != 1");
//            
//            System.out.println(exp1.toJavaClass());
//            simhya.matheval.CompiledExpression ce = exp1.compileExpression();
//            
            
            
            
            
//            int reps=1000000;
//            long time = System.nanoTime();
//            for (int i=0;i<reps;i++)
//                exp1.computeValue();
//            time = System.nanoTime() - time;
//            double nc = (double)time/1000000000;
//            System.out.println("Non compiled: " + nc);
//            time = System.nanoTime();
//            for (int i=0;i<reps;i++)
//                ce.evaluate();
//            time = System.nanoTime() - time;
//            double c = (double)time/1000000000;
//            System.out.println("Compiled: " + c);
//            System.out.println("Speedup: " + nc/c);
//        } catch (Exception ex) {
//            ex.printStackTrace();
//        } catch (Error err) {
//            err.printStackTrace();
//        }
    }
    
    private static void contains(simhya.matheval.Expression exp, String symbol) {
        if (exp.containsSymbol(symbol))
                System.out.println(exp.toString() + " contains symbol " + symbol);
        if (exp.containsConstant(symbol))
                System.out.println(exp.toString() + " contains constant " + symbol);
        if (exp.containsGlobalVariable(symbol))
                System.out.println(exp.toString() + " contains global variable " + symbol);
        if (exp.containsExpressionVariable(symbol))
                System.out.println(exp.toString() + " contains expression variable " + symbol);
        if (exp.containsBoundVariable(symbol))
                System.out.println(exp.toString() + " contains bound variable " + symbol);
    }


}